GitHub Apps と add-to-project アクションで、リポジトリに作成された Issues を Projects に自動追加するワークフローを作成してみた
こんにちは、製造ビジネステクノロジー部の若槻です。
GitHub で add-to-project アクションを使うと、Issues やプルリクエストを自動的に Projects に追加するワークフローを簡単に作成することができます。
今回は、GitHub Apps と add-to-project アクションで、リポジトリに作成された Issues を Projects に自動追加するワークフローを作成してみました。
PAT の利用は組織で制限されている可能性がある
PAT (Personal Access Token) は GitHub の API にアクセスするための認証トークンですが、古いタイプのトークンであり権限の粒度が粗いため、組織での利用が制限されている場合があります。
利用が制限されている組織で PAT を使って API にアクセスをすると以下のようなエラーが発生します。
$ curl -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3+json" "$API_ENDPOINT/repos/$ORGANIZATION_NAME/$REPO_NAME/issues?state=open"
{
"message": "`classmethod-internal` forbids access via a personal access token (classic). Please use a GitHub App, OAuth App, or a personal access token with fine-grained permissions.",
"documentation_url": "https://docs.github.com/rest/issues/issues#list-repository-issues",
"status": "403"
}
ここで、リポジトリに作成された Issues を Projects に自動追加するワークフローを簡単に作成できるアクションである add-to-project では、認証トークンとして PAT を利用した下記のようなワークフローのサンプルが README に記載されています。
name: Add issue to project
on:
issues:
types:
- opened
jobs:
add-to-project:
name: Add issue to project
runs-on: ubuntu-latest
steps:
- uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/classmethod-internal/projects/1
github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
しかし、組織で PAT の利用が制限されている場合、このサンプルをそのまま利用することはできません。
PAT を GitHub Apps に置き換えてみた
そこで、今回のブログの目的でもある「使用する認証トークンを PAT から、GitHub Apps で取得したトークンに置き換えたワークフロー」を作成してみます。
GitHub Apps の作成およびインストール
GitHub.com で https://github.com/settings/apps より、次の権限を持つ GitHub Apps を作成します。
権限レベル | Read/Write | 権限内容 |
---|---|---|
リポジトリ | Read | issues and metadata |
組織 | Read & Write | organization projects |
アカウント | - | - |
ここで、Apps は本来ならリポジトリが作成されている組織に作成するべきでしょうが、今回は一旦個人アカウントに作成しました。
Apps のインストール時の権限のリクエストは、Issues の追加元リポジトリおよび、Issues の追加先の Projects の組織に対して行います。ちなみに、組織に対して権限をリクエストする場合は、組織のオーナー権限が必要です。
オーナーにより権限のリクエストが許可されたら、リポジトリに Apps がインストールされます。
変数及びシークレットの設定
先ほど作成した GitHub Apps の App ID をリポジトリの変数に、秘密鍵をシークレットに設定します。
今回は APP_ID
と PRIVATE_KEY
という名前で設定しました。
ワークフロー
次のようなワークフローを作成します。
name: Add issue to project
on:
issues:
types:
- opened
jobs:
add-to-project:
name: Add issue to project
runs-on: ubuntu-latest
steps:
- uses: actions/create-github-app-token@v1
id: create-github-app-token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
- uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/classmethod-internal/projects/1
github-token: ${{ steps.create-github-app-token.outputs.token }}
create-github-app-token アクションを使うと、GitHub Apps でトークンを取得することができます。
取得したトークンを PAT の代わりに add-to-project アクションに渡すことで、リポジトリに作成された Issues を Projects に自動追加するようにしています。
動作確認
リポジトリに適当な Issue を作成すると、ワークフローが実行されました。
ワークフローにより Issues が Projects の No status カラム(指定が無い場合は既定でこのカラムとなる)に追加されました!
おわりに
GitHub Apps と add-to-project アクションで、リポジトリに作成された Issues を Projects に自動追加するワークフローを作成してみました。
add-to-project もですが、create-github-app-token アクションもなかなか便利ですね。GitHub Apps でトークンを取得する際には実質必須のアクションとなりそうなので、PAT が classic な機能として今後の利用が非推奨となっていく中で、お世話になる場面が増えていきそうです。
以上